#include <iostream>
#include <functional>
#include <vector>
#include <unistd.h>
#include <pthread.h>

using namespace std;

/*
test：条件变量的使用
*/


// 定义条件变量
pthread_cond_t cond;
// 定义互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

vector<function<void*()>> fcntors;

bool quit = false;

void* waitcommand(void* args) {
    pthread_detach(pthread_self());
    while (!quit) 
    {
        // 执行了下面这段代码，证明某一种条件还没就绪，需要当前线程进行等待阻塞
        // 让对应的线程进行等待，等待被唤醒
        // 3个线程都会在该条件变量下排队
        pthread_cond_wait(&cond, &mutex);
        cout << "thread id = [" << pthread_self() << "] running" << endl;
    }
}

void* show() 
{
    cout << "蠢驴" << endl;
}

int main()
{
    fcntors.push_back(show);
    pthread_cond_init(&cond, nullptr);

    pthread_t tid_a, tid_b, tid_c;
    pthread_create(&tid_a, nullptr, waitcommand, (void*) "hello");
    pthread_create(&tid_b, nullptr, waitcommand, (void*) "hello");
    pthread_create(&tid_b, nullptr, waitcommand, (void*) "hello");

    while (true)
    {
        sleep(1);
        pthread_cond_broadcast(&cond);
        // char n = 'a';
        // // cout 和 cin 交替使用的时候会刷新缓冲区
        // cout << "input your command(n/q) -> ";
        // cin >> n; 
        // if (n == 'n') 
        // {
        //     pthread_cond_signal(&cond);
        // }
        // else 
        // {
        //     quit = true;
        //     break;
        // }

        // sleep(1);
    }
    cout << "main quit" << endl;
    // 把所有线程全部取消，然后再唤醒
    pthread_cond_broadcast(&cond);

    pthread_cond_destroy(&cond);
    return 0;
}